package com.example.voicebox.tools;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioAttributes;
import android.media.MediaPlayer;
import android.media.SoundPool;

import com.example.voicebox.model.VoiceBox;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 封装声音播放工具类
 */
public class VoicePlayer {

    private static final int MAX_SOUNDS = 10;//同时播放音频的最大数量

    private static final String VOICE_FOLDER = "voice";//定义音频的目录

    private AssetManager mAssetManager;//Asset资源管理器,使用{@link AssetManager}来读取assets下的音频文件

    private SoundPool mSoundPool;// 音效的播放工具,使用{@link SoundPool}来播放音频，该工具只能播放6s内的音频

    private List<VoiceBox> mVoiceBoxList;//存放音效的集合

    private MediaPlayer mBGMPlayer;//背景音的播放工具

    private VoiceBox mBGM; //背景音，手动控制播放暂停。由于时间长，使用{@link android.media.MediaPlayer}播放

    /**
     * 初始化工具类，初始化内容：
     * 1、mAssetManager
     * 2、mSoundPool
     * 3、mVoiceList
     * 4、mBGMPlayer
     *
     * 初始化音频资源的加载步骤
     * */
    public VoicePlayer(Context context){
        //初始化资源管理器
        mAssetManager =context.getAssets();
        //定义声音的一些设置（建造者模式）
        AudioAttributes audioAttr = new AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)//设置声音的类型，这里使用表示短促声音的类型
                .build();//调用build()方法，表示建造完成。
        //初始化音频播放工具（建造者模式）
        mSoundPool = new SoundPool.Builder()
                .setMaxStreams(MAX_SOUNDS)
                .setAudioAttributes(audioAttr)//这里需要传入AudioAttributes对象，提前构建好
                .build();//调用build()方法，表示建造完成。
        //初始化并指定容量为100
        mVoiceBoxList = new ArrayList<>(100);
        //初始化背景音的播放工具
        mBGMPlayer = new MediaPlayer();
        //加载音频
        loadVoice();
    }
    /**
     * 读取音频文件：
     * 1、获取音频文件列表
     * 2、放入{@link SoundPool}
     * 3、区分bgm和音效
     * 4、音效装入集合{@link VoicePlayer#mVoiceBoxList}
     * */
    public void loadVoice(){
        try {
            String[] fileNames = mAssetManager.list(VOICE_FOLDER);
            for (String fileName:fileNames){
                String path = VOICE_FOLDER + "/" +fileName;//拼接完整的资源路径
                String filenameNoSuffix = fileName.replace(".mp3", "");
                VoiceBox voiceBox = new VoiceBox();
                voiceBox.setName(filenameNoSuffix);
                //处理音频，加载到SoundPool中，并返回在Pool中的id
                AssetFileDescriptor fd = mAssetManager.openFd(path);




                //单独处理BGM的情况
                if ("bgm".equals(filenameNoSuffix)){//如果取后缀的文件名==bgm
                    mBGMPlayer.setDataSource(fd);
                    mBGMPlayer.prepare();//做准备工作，准备播放
                }else {
                    int soundId =  mSoundPool.load(fd,1);//兼容
                    voiceBox.setSoundId(soundId);//该id在播放音频时需要
                    mVoiceBoxList.add(voiceBox);

                }


            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 播放音效
     * @param voiceBox
     * */
    public void playVoice(VoiceBox voiceBox){
        Integer soundId = voiceBox.getSoundId();
        //播放音效
        mSoundPool.play(voiceBox.getSoundId(),1,1,1,0,1);
    }

    public void stopSonic(){
        mSoundPool.release();
    }

    public List<VoiceBox> getVoiceBoxList(){
        return mVoiceBoxList;
    }

    /**
     * 播放BGM
     * */
    public void playerBGM(){
        boolean playing = mBGMPlayer.isPlaying();
        if (playing){
            mBGMPlayer.pause();
        }else {
            mBGMPlayer.start();
        }
    }

    public void pauseBGM() {
        mBGMPlayer.pause();
    }


    public void stopBGM(){
        mBGMPlayer.stop();
        mBGMPlayer.release();
    }



}
